package com.jxpanda.infrastructure.core.constant;

import lombok.RequiredArgsConstructor;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.function.Function;

/**
 * HTTP授权类型的枚举，定义了不同的授权令牌构建方式。
 *
 * @author Panda
 */
@RequiredArgsConstructor
public enum HttpAuthorizationType {

    /**
     * Bearer令牌类型，用于OAuth2等认证场景。
     */
    BEARER("Bearer", token -> token),
    /**
     * Basic认证类型，使用Base64编码的用户名和密码。
     */
    BASIC("Basic", token -> Base64.getEncoder().encodeToString(token.getBytes(StandardCharsets.UTF_8))),
    /**
     * API Key认证类型，直接使用API Key作为认证信息。
     */
    API_KEY("ApiKey", token -> token);

    /**
     * 授权类型的前缀，如"Bearer"、"Basic"等。
     */
    private final String prefix;

    /**
     * 用于构建授权令牌的函数接口，根据不同的授权类型，构建不同的令牌格式。
     */
    private final Function<String, String> tokenBuilder;

    /**
     * 根据提供的令牌构建授权头信息。
     *
     * @param token 用户的认证令牌。
     * @return 构建好的授权头信息。
     */
    public String build(String token) {
        return prefix + " " + tokenBuilder.apply(token);
    }


}
